package com.AdvancedDemos;

import com.FundamentalDemos.commonAPI.Demo;

import java.util.ArrayList;

public class 包装类 {
    public static void main(String[] args) {
        //包装类就是把基本类型的数据包装成对象,有基本类型封装成引用类型
        /**
         * 1 byte    ->  Byte
         * 2 short   ->  Short
         * 3 int     ->  Integer    ❤
         * 4 long    ->  Long
         * 5 char    ->  Character  ❤
         * 6 float   ->  Float
         * 7 double  ->  Double
         * 8 boolean ->  Boolean
         */


        /**
         * 1.Integer
         */

        //Integer面试题
        Integer aa = 127;
        Integer bb = 127;
        System.out.println(aa == bb);//true
        Integer cc = 128;
        Integer dd = 128;
        System.out.println(cc == dd);//false
        //Integer接收int范围[-128,127]之间,不会创建新的Integer对象,而是直接复用之前产生存在数组中的对象,超出[-128,127]之间,每次都会new Integer(数据值),"对象==对象"比较的是地址值,于是127时是同一个地址,返回true,而128时是不同地址,返回false


        System.out.println("---------------------");
        Integer i = new Integer(12);//'Integer(int)' 已被弃用
        System.out.println(i);
        i = Integer.valueOf(13);
        System.out.println(i);
        /*
        借助自动装箱机制,int类型可以自动在赋值过程中自动装箱变成Integer类型
         */
        Integer i1 = 11;
        System.out.println(i1);
        /*
        与之对应的是自动拆箱机制,可以直接把包装类对象赋给基础类型
         */
        int i2 = i1;
        System.out.println(i2);
        /*
        泛型和集合不支持基本数据类型,只支持引用类型
         */
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(9);//自动装箱,int -> Integer
        list.add(15);
        int i3 = list.get(1);//自动拆箱 Integer -> int
        System.out.println("i3 = " + i3);

        //包装中的常量属性:
        System.out.println(Integer.MAX_VALUE);
//        0111 1111  1111 1111  1111 1111  1111 1111
        System.out.println(Integer.MIN_VALUE);
//        1000 0000  0000 0000  0000 0000  0000 0000

        //包装类常用函数:

        System.out.println("---------------------");
        /**
         * 1.Integer/Double等等包装类名.toString()把基本类型的数据转换成字符串
         * public static String toString(int i){ ... }
         */
        //将基本类型变成字符串
        i1 = 23;
        String s = Integer.toString(i1);
        System.out.println(s + 1);//231
        //也可以用包装类继承自Object类的toString方法
        System.out.println(i1.toString() + 1);//231

        //对于基础类型的数据想要变成字符串,也可以直接使用+连接字符串
        String a = i1 + "";
        System.out.println(a + 1);


        System.out.println("---------------------");
        /**
         * 2.Integer/Double等等包装类名.parseInt(str)/parseDouble(str) 把字符串类型的数值转换成对应的基础类型数值
         * public static int parseInt(String s) throws NumberFormatException { ... }
         * public static double parseDouble(String s) throws NumberFormatException { ... }
         */
        int i4 = Integer.parseInt("328");
        System.out.println(i4);
        System.out.println(i4 - 1);

        double v = Double.parseDouble("99.99");
        System.out.println(v);
        System.out.println(v + 0.01);


        System.out.println("---------------------");
        /**
         * 3.Integer/Double等等包装类名.valueOf(str) 与parseInt,parseDouble类似,但更推荐使用用于获取字符串中的数值
         * public static Integer valueOf(String s) throws NumberFormatException { ... }
         * public static Double valueOf(String s) throws NumberFormatException { ... }
         */
        int i5 = Integer.valueOf("-321");
        double v1 = Double.valueOf("1.23");
        System.out.println(i5 + " " + v1);
        System.out.println((i5 + 1) + " " + (v1 - 1));
        //当字符串中含有非数值时会报错NumberFormatException数字格式异常
        //Integer.valueOf("29.85")也会报错数字格式异常


        System.out.println("---------------------");
        //将其他基本类型转成String类型
        System.out.println(String.valueOf(1));
        System.out.println(String.valueOf(true));
        System.out.println(String.valueOf('c'));
        System.out.println(String.valueOf(new char[]{'a', 'b', 'c'}));
        System.out.println(String.valueOf(12.34));
        System.out.println(String.valueOf(2.5f));
        System.out.println(String.valueOf(100L));
        System.out.println(String.valueOf(new Demo()));


    }
}
